<!DOCTYPE html>
<html>
        <head>
                <title>视图</title>
                <meta charset="UTF-8">
                <meta name="viewport" content="width=device-width, initial-scale=1.0">
                <script src="js/inc.js"></script>
        </head>
        <body>
                <fieldset>
                        <legend>视图</legend>
                        <ol>
                                <li>
                                        <h2 class="title_h2">加载视图</h2>
                                        1.视图文件都放在<code>application/views</code>文件夹里面 
                                        <br>2.可以在任意地方使用下面的代码加载视图:
                                        <br>示例如下：
                                        <pre class="brush:php">
                                                Sr::view()->load($view_name, $data, $is_return);
                                        </pre>
                                        其中$view_name是视图文件名（不含后缀），$data是要传递到视图中的数据（关联数组），$is_return是返回视图内容。
                                        <br>比如：
                                        <br>视图文件<code>application/views/index.php</code>，在任意地方使用里就可以通过<code>Sr::view()->load('index')</code>加载视图。
                                        <br>3.我们还提供加载主项目的视图，这个一般是在hmvc模块中使用到，用于复用主项目的视图文件，比如通用的header等。
                                        <br>示例如下：
                                        <pre class="brush:php">
                                                Sr::view()->loadParent($view_name, $data, $is_return);
                                        </pre>
                                        我们可以看到<code>loadParent</code>也是有三个参数，其实三个参数跟<code>load</code>用法一样。
                                        <br><b class="text_strong">提示：</b>
                                        <br>了解详细的HMVC,点击进入<a href="hmvc.html">HMVC</a>                                        
                                </li>
                                <li>
                                        <h2 class="title_h2">传递数据</h2>
                                        比如：
                                        <br>数据<code>$data = array('title' => '首页')</code>,然后可以在加载视图的时候通过以下三种方法将数据传递给视图。
                                        <h3 class="title_h3">1.直接data传递</h3>
                                        如下：
                                        <pre class="brush:php">
                                        Sr::view()->load('index', $data);
                                        </pre>
                                        <h3 class="title_h3">2.直接set传递</h3>
                                        如下：
                                        <pre class="brush:php">
                                        Sr::view()->set($data)->load('index');
                                        //还有另一种方式如下
                                        Sr::view()->set('title', 'set首页')->load('index');
                                        //也是可以用以下方式
                                        Sr::view()->set('title', 'set首页');
                                        Sr::view()->load('index');
                                        </pre>
                                        <h3 class="title_h3">3.直接add传递</h3>
                                        如下：
                                        <pre class="brush:php">
                                        Sr::view()->add($data)->load('index');
                                        //还有另一种方式如下
                                        Sr::view()->add('title', 'add首页')->load('index');
                                        //也是可以用以下方式
                                        Sr::view()->add('title', 'add首页');
                                        Sr::view()->load('index');
                                        </pre>
                                        <h3 class="title_h3">4.set、add和直接传递data的区别</h3>
                                        1.<code>set</code>和<code>add</code>添加的数据在所有的视图中都可以使用，包括视图里面包含另外一个视图，
                                        <br>传递<code>data</code>的数据只对当前的视图起作用，如果这个视图包含其它视图，包含其它视图是获取不到<code>data</code>里面的数据的。
                                        <br>2.如果之前有数据存在，<code>set</code>方法会直接覆盖,<code>add</code>方法是不会覆盖。
                                        <br>示例如下:
                                        <br>2.1.新建视图文件application/views/test_load_data.php 
                                        <br>输入以下代码：
                                        <pre class="brush:php">
                                                &lt;?php echo $a; ?&gt;
                                        </pre>
                                        2.2.新建控制器文件application/classes/Controller/Welcome.php 
                                        <br>输入以下代码：
                                        <pre class="brush:php">
                                        &lt;?php

                                        class Controller_Welcome extends Soter_Controller {

                                                public function do_set() {
                                                        $data = array('a' => 'vvv');
                                                        $data2 = array('a' => 333);
                                                        Sr::view()->set($data);
                                                        return Sr::view()->set($data2)->load('test_load_data');
                                                }

                                                public function do_add() {
                                                        $data = array('a' => 'vvv');
                                                        $data2 = array('a' => 333);
                                                        Sr::view()->add($data);
                                                        return Sr::view()->add($data2)->load('test_load_data');
                                                }
                                        }
                                        </pre>
                                        浏览器访问：http://127.0.0.1/index.php/Welcome/set.do 
                                        <br>将会输出：333
                                        <br>浏览器访问：http://127.0.0.1/index.php/Welcome/add.do 
                                        <br>将会输出：vvv
                                        <br>我们可以看到上面结果是，<code>set</code>方法会直接覆盖之前数据，而<code>add</code>是不会覆盖之前数据。
                                        <br>3.三种方法里面有同名的数据覆盖优先级是：<code>data</code> > <code>set</code> > <code>add</code>
                                        <br>示例如下：
                                        <br>3.1.新建视图文件application/views/test_data.php 
                                        <br>输入以下代码：
                                        <pre class="brush:php">
                                                &lt;?php echo $test; ?&gt;
                                        </pre>
                                        3.2.新建控制器文件application/classes/Controller/Welcome.php 
                                        <br>输入以下代码：
                                        <pre class="brush:php">
                                        &lt;?php

                                        class Controller_Welcome extends Soter_Controller {

                                                public function do_view() {
                                                        $data = array('test' => 'add');
                                                        $data2 = array('test' => 'set');
                                                        $data3 = array('test' => 'data');
                                                        Sr::view()->add($data);
                                                        return Sr::view()->set($data2)->load('test_data', $data3);
                                                }
                                        }
                                        </pre>
                                        浏览器访问：http://127.0.0.1/index.php/Welcome/view.do 
                                        <br>将会输出：data
                                        <br><b>从上面我们可以看到结果是:</b>
                                        <br><code>data</code>里面的同名数据会覆盖<code>set</code>或者<code>add</code>里面的同名数据。
                                </li>
                                <li>
                                        <h2 class="title_h2">返回视图内容</h2>
                                        默认情况下<code>Sr::view()->load()</code>会直接把生成的内容显示到浏览器。
                                        <br>可以通过传递第三个参数改变这个默认行为，当第三个参数为<b>true</b>时，生成的视图内容会返回而不是显示在页面上。
                                        <br>比如：<code>$html = Sr::view()->load('index', null, true)</code>;
                                </li>
                                <li>
                                        <h2 class="title_h2">包含其它视图</h2>
                                        在视图中可以包含其他视图文件,视图文件里面可以通过<code>Sr::view()->load($view_name)</code>加载。
                                        <br>比如：
                                        <br>在视图index.php里面有如下内容：
                                        <pre class="brush:php">
                                                &lt;?php Sr::view()->load('common/header'); ?&gt;
                                        </pre>
                                        那么这个就是包含视图目录下面的common文件夹里面的header.php视图文件。 
                                </li>
                                <li>
                                        <h2 class="title_h2">创建自己的视图</h2>
                                        下面我们自定义一个加载视图
                                        <br>1.新建视图文件application/views/welcome.php 
                                        <br>输入以下代码：
                                        <pre class="brush:php">
                                                &lt;?php echo $test; ?&gt;
                                        </pre>
                                        2.新建控制器文件application/classes/Controller/Welcome.php 
                                        <br>输入以下代码：
                                        <pre class="brush:php">
                                                &lt;?php

                                                class Controller_Welcome extends Soter_Controller {

                                                        public function do_view() {
                                                                $data = array('test' => '测试内容');
                                                                return Sr::view()->load('welcome', $data);
                                                        }
                                                }  
                                        </pre>
                                        3.浏览器访问：http://127.0.0.1/index.php/Welcome/view.do 
                                        <br>将输出:<b>测试内容</b>
                                        <br><b class="text_strong">提示：</b>
                                        <br>了解详细的控制器,点击进入<a href="controller.html">控制器</a>
                        </ol>
                </fieldset>
                <script src="js/inc.foot.js"></script>
        </body>
</html>
